package com.hui.admin.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hui.admin.dto.request.*;
import com.hui.admin.dto.response.UserForgetPasswordResponseDTO;
import com.hui.admin.dto.response.UserLoginResponseDTO;
import com.hui.admin.dto.response.UserPageResponseDTO;
import com.hui.admin.entity.UserDO;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

/**
 * 用户服务接口层
 */
public interface UserService extends IService<UserDO> {

    /**
     * 删除用户
     *
     * @param id ID
     */
    void deleteUserById(Long id);

    /**
     * 新增用户
     *
     * @param requestDTO 请求参数
     */
    void addUser(UserSaveRequestDTO requestDTO);

    /**
     * 修改用户
     *
     * @param requestDTO 请求参数
     */
    void updateUser(UserSaveRequestDTO requestDTO);

    /**
     * 分页查询
     *
     * @param requestDTO 请求参数
     */
    UserPageResponseDTO getUserPage(UserPageRequestDTO requestDTO);

    /**
     * 修改用户状态
     *
     * @param username 用户名
     * @param status   状态
     */
    void updateUserStatus(String username, Integer status);

    /**
     * 批量删除用户
     *
     * @param ids ID 数组
     */
    void deleteUsers(Long[] ids);

    /**
     * 条件导出用户数据
     *
     * @param response   响应
     * @param requestDTO 请求参数
     * @throws IOException IO 异常
     */
    void exportUsers(HttpServletResponse response, UserExportRequestDTO requestDTO) throws IOException;

    /**
     * 导入用户数据
     *
     * @param file 文件
     */
    void importUsers(MultipartFile file);

    /**
     * 用户登录
     *
     * @param request 请求参数
     * @return 响应实体
     */
    UserLoginResponseDTO login(UserLoginRequestDTO request);

    /**
     * 生成验证码
     *
     * @param response 响应
     */
    void getShearCaptcha(HttpServletResponse response);

    /**
     * 注册
     */
    void register(UserRegisterRequestDTO request);

    /**
     * 忘记密码
     *
     * @param request 请求参数
     * @return 返回参数
     */
    UserForgetPasswordResponseDTO forgetPassword(UserForgetPasswordRequestDTO request);

    /**
     * 忘记密码（确认）
     *
     * @param request 请求参数
     */
    void forgetPasswordConfirm(UserForgetPasswordRequestDTO request);

    /**
     * 修改用户密码
     *
     * @param requestDTO 请求参数
     */
    void updateUserPassword(@Valid UserChangePasswordRequestDTO requestDTO);

    /**
     * 根据用户名获取用户ID
     *
     * @param username 用户名
     * @return 用户ID
     */
    Long getUserIdByUsername(String username);
}
